@苏苏
2年前 提问
1个回答
Linux提供的原子操作接口有几个
安全侠
2年前
** Linux提供的两个原子操作接口:**
原子整数操作:
针对整数的原子操作只能对atomic_t类型的数据处理。这里没有使用C语言的int类型,主要是因为:
让原子函数只接受atomic_t类型操作数,可以确保原子操作只与这种特殊类型数据一起使用。
使用atomic_t类型确保编译器不对相应的值进行访问优化。 (原理为: 变量被volatile修饰了)
使用atomic_t类型可以屏蔽不同体系结构上的数据类型的差异。尽管Linux支持的所有机器上的整型数据都是32位,但是使用atomic_t的代码只能将该类型的数据当作24位来使用。这个限制完全是因为在SPARC体系结构上,原子操作的实现不同于其它体系结构:32位int类型的低8位嵌入了一个锁,因为SPARC体系结构对原子操作缺乏指令级的支持,所以只能利用该锁来避免对原子类型数据的并发访问。
原子整数操作最常见的用途就是实现计数器。原子整数操作列表在中定义。原子操作通常是内敛函数,往往通过内嵌汇编指令来实现。如果某个函数本来就是原子的,那么它往往会被定义成一个宏。
原子位操作:
原子位操作定义在文件中。令人感到奇怪的是位操作函数是对普通的内存地址进行操作的。原子位操作在多数情况下是对一个字节长的内存访问,因而位号该位于0-31之间(在64位机器上是0-63之间),但是对位号的范围没有限制。
操作系统可以确保,在同一时刻,只有一个CPU的一个进程访问特定的某个字节,再加上单核中的原子性(基本数据类型的简单操作),所以单字节内存的简单操作是具有天生的多核原子性的。